4  Personnalisation graphiques avec ggplot2

library(tidyverse)
df <- read.csv("DATA/tps00026_LE_65_Eurostat_database.csv")

summary(df)
   DATAFLOW         LAST.UPDATE            freq               unit          
 Length:1578        Length:1578        Length:1578        Length:1578       
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
     age                sex                geo             TIME_PERIOD  
 Length:1578        Length:1578        Length:1578        Min.   :2010  
 Class :character   Class :character   Class :character   1st Qu.:2012  
 Mode  :character   Mode  :character   Mode  :character   Median :2015  
                                                          Mean   :2015  
                                                          3rd Qu.:2018  
                                                          Max.   :2021  
   OBS_VALUE       OBS_FLAG        
 Min.   :11.60   Length:1578       
 1st Qu.:17.00   Class :character  
 Median :18.90   Mode  :character  
 Mean   :18.64                     
 3rd Qu.:20.60                     
 Max.   :24.00                     

5 Nuage de points

ggplot(df, aes(x=TIME_PERIOD, y=OBS_VALUE))+
  geom_point()

5.1 Personnalisation des axes

Changer le nom des axes avec xlab et ylab

ggplot(df, aes(x=TIME_PERIOD, y=OBS_VALUE))+
  geom_point() + 
  xlab("Year") +
  ylab("Life expectancy at 65 (years)")

Spécifier la graduation des axes avec scale_x et scale_y

ggplot(df, aes(x=TIME_PERIOD, y=OBS_VALUE))+
  geom_point()+
  xlab("Year") +
  ylab("Life expectancy at 65 (years)")+
  scale_x_continuous(breaks = seq(2010, 2021, 2))+
  scale_y_continuous(limits = c(10,25))

Si la variable de l’axe des x est catégorielle, on utilise scale_x_discrete au lieu de scale_x_continuous

Pivoter les labels de l’axe des x avec theme et l’option angle

ggplot(df, aes(x=TIME_PERIOD, y=OBS_VALUE))+
  geom_point()+
  xlab("Year") +
  ylab("Life expectancy at 65 (years)")+
  scale_x_continuous(breaks = seq(2010, 2021, 2))+
  scale_y_continuous(limits = c(10,25))+
  theme(axis.text.x = element_text(angle = 30))

Changer la taille de police du nom des axes

ggplot(df, aes(x=TIME_PERIOD, y=OBS_VALUE))+
  geom_point()+
  xlab("Year") +
  ylab("Life expectancy at 65 (years)")+
  scale_x_continuous(breaks = seq(2010, 2021, 2))+
  scale_y_continuous(limits = c(10,25))+
  theme(axis.text.x = element_text(angle = 30),
        axis.title = element_text(size = 14))

Changer la taille de police des labels

ggplot(df, aes(x=TIME_PERIOD, y=OBS_VALUE))+
  geom_point()+
  xlab("Year") +
  ylab("Life expectancy at 65 (years)")+
  scale_x_continuous(breaks = seq(2010, 2021, 2))+
  scale_y_continuous(limits = c(10,25))+
  theme(axis.text.x = element_text(angle = 30, size = 12),
        axis.text.y = element_text(size = 13),
        axis.title = element_text(size = 14))

Pour plus de détails sur la personnalisation des axes :
http://www.sthda.com/english/wiki/ggplot2-axis-ticks-a-guide-to-customize-tick-marks-and-labels en anglais
ou https://www.datanovia.com/en/fr/blog/ggplot-graduations-des-axes-definir-et-pivoter-les-textes/ en français

5.2 Changer le fond du graphiques

On peut changer le fond des graphiques en appliquant des themes. Il y en a des prédéfinis, mais il est aussi possible de tout faire manuellement

theme_classique ne laisse qu’un fond bland

ggplot(df, aes(x=TIME_PERIOD, y=OBS_VALUE))+
  geom_point()+
  xlab("Year") +
  ylab("Life expectancy at 65 (years)")+
  scale_x_continuous(breaks = seq(2010, 2021, 2))+
  scale_y_continuous(limits = c(10,25))+
  theme_classic()+ # ATTENTION, il faut placer cette fonction avant theme() sinon elle annule ce qui est mis dans theme()
  theme(axis.text.x = element_text(angle = 30, size = 12),
        axis.text.y = element_text(size = 13),
        axis.title = element_text(size = 14))

theme_bw change l’arrière plan gris en blanc

ggplot(df, aes(x=TIME_PERIOD, y=OBS_VALUE))+
  geom_point()+
  xlab("Year") +
  ylab("Life expectancy at 65 (years)")+
  scale_x_continuous(breaks = seq(2010, 2021, 2))+
  scale_y_continuous(limits = c(10,25))+
  theme_bw()+ # ATTENTION, il faut placer cette fonction avant theme() sinon elle annule ce qui est mis dans theme()
  theme(axis.text.x = element_text(angle = 30, size = 12),
        axis.text.y = element_text(size = 13),
        axis.title = element_text(size = 14))

il y a d’autres themes a essayer. Ces theme prédéfinis évite de tout spécifier à la main dans la fonction theme(), mais on pourrait très bien obtenir la même chose en définissant nous-même toutes les caractéristiques de l’arrière plan via la fonction theme() et les arguments commençant par “panel”

ggplot(df, aes(x=TIME_PERIOD, y=OBS_VALUE))+
  geom_point()+
  xlab("Year") +
  ylab("Life expectancy at 65 (years)")+
  scale_x_continuous(breaks = seq(2010, 2021, 2))+
  scale_y_continuous(limits = c(10,25))+
  theme(axis.text.x = element_text(angle = 30, size = 12),
        axis.text.y = element_text(size = 13),
        axis.title = element_text(size = 14),
        panel.background = element_rect(fill = "white", colour = "red", linetype = "solid"), # Fond blanc mais avec le cadre rouge autour
        panel.grid.minor.y = element_blank(), # ne laisse que les graduations qui ont un label (supprime la graduation intermédiaire) pour l'axe des y
        panel.grid.major = element_line(colour = "grey", linewidth = 1), # Graduations principales des deux axes en gris et assez grosses
        panel.grid.minor.x = element_line(colour = "lightblue", linewidth = 0.5) # Graduations intermédiaires de l'axe x en bleu clair et fines
        )  

Pour plus de détail sur les thèmes prédéfinis et les options de la fonction theme() : http://www.sthda.com/english/wiki/ggplot2-themes-and-background-colors-the-3-elements

6 Colorer en fonction d’une variable

On colore les points par pays

ggplot(df, aes(x=TIME_PERIOD, y=OBS_VALUE, col = geo))+
  geom_point()+
  xlab("Year") +
  ylab("Life expectancy at 65 (years)")+
  scale_x_continuous(breaks = seq(2010, 2021, 2))+
  scale_y_continuous(limits = c(10,25))+
  theme_bw() 

Pour plus de lisibilité on ne va garder que la France, le Danemark, l’Italie et l’Albanie

df1 <- df %>% 
  filter(geo %in% c("FR", "DK", "IT", "AL" ))
ggplot(df1, aes(x=TIME_PERIOD, y=OBS_VALUE, col = geo))+
  geom_point()+
  xlab("Year") +
  ylab("Life expectancy at 65 (years)")+
  scale_x_continuous(breaks = seq(2010, 2021, 2))+
  scale_y_continuous(limits = c(10,25))+
  theme_bw() 

Spécifier soi-même les couleurs

ggplot(df1, aes(x=TIME_PERIOD, y=OBS_VALUE, col = geo))+
  geom_point()+
  xlab("Year") +
  ylab("Life expectancy at 65 (years)")+
  scale_x_continuous(breaks = seq(2010, 2021, 2))+
  scale_y_continuous(limits = c(10,25))+
  theme_bw()+
  scale_color_manual(values = c("#999999", "#E69F00", "#56B4E9", "firebrick"))

Pour plus d’information sur la spécification des couleurs : http://www.sthda.com/english/wiki/ggplot2-colors-how-to-change-colors-automatically-and-manually

6.1 Modifier la légende

Changer le titre de la légende

ggplot(df1, aes(x=TIME_PERIOD, y=OBS_VALUE, col = geo))+
  geom_point()+
  xlab("Year") +
  ylab("Life expectancy at 65 (years)")+
  scale_x_continuous(breaks = seq(2010, 2021, 2))+
  scale_y_continuous(limits = c(10,25))+
  theme_bw()+
  scale_color_manual(values = c("#999999", "#E69F00", "#56B4E9", "firebrick"))+
  labs(col = "Pays")

Augmenter la taille des points de couleur dans la légende

ggplot(df1, aes(x=TIME_PERIOD, y=OBS_VALUE, col = geo))+
  geom_point()+
  xlab("Year") +
  ylab("Life expectancy at 65 (years)")+
  scale_x_continuous(breaks = seq(2010, 2021, 2))+
  scale_y_continuous(limits = c(10,25))+
  theme_bw()+
  scale_color_manual(values = c("#999999", "#E69F00", "#56B4E9", "firebrick"))+
  labs(col = "Pays")+
  guides(colour = guide_legend(override.aes = list(size=5)))

Changer la taille de police et la couleur de l’écriture de la légende

ggplot(df1, aes(x=TIME_PERIOD, y=OBS_VALUE, col = geo))+
  geom_point()+
  xlab("Year") +
  ylab("Life expectancy at 65 (years)")+
  scale_x_continuous(breaks = seq(2010, 2021, 2))+
  scale_y_continuous(limits = c(10,25))+
  theme_bw()+
  scale_color_manual(values = c("#999999", "#E69F00", "#56B4E9", "firebrick"))+
  labs(col = "Pays")+
  guides(colour = guide_legend(override.aes = list(size=5)))+
  theme(legend.title = element_text(size = 13, color = "purple"),
        legend.text = element_text(size = 10))

Changer les noms des modalités dans la légende

ggplot(df1, aes(x=TIME_PERIOD, y=OBS_VALUE, col = geo))+
  geom_point()+
  xlab("Year") +
  ylab("Life expectancy at 65 (years)")+
  scale_x_continuous(breaks = seq(2010, 2021, 2))+
  scale_y_continuous(limits = c(10,25))+
  theme_bw()+
  scale_color_manual(values = c("#999999", "#E69F00", "#56B4E9", "firebrick"),
                     labels = c("AL" = "Albanie",
                                                                                          "DK" = "Danemark", 
                                                                                          "FR" = "France",
                                                                                          "IT" = "Italie"))+
  labs(col = "Pays")+
  guides(colour = guide_legend(override.aes = list(size=5)))+
  theme(legend.title = element_text(size = 13, color = "darkblue"),
        legend.text = element_text(size = 10))

Pour plus d’information sur la personnalisation de la légende : https://www.datanovia.com/en/blog/ggplot-legend-title-position-and-labels/

7 Forme en fonction d’une variable

Forme du point en fonction de la variable SEX avec shape

ggplot(df1, aes(x=TIME_PERIOD, y=OBS_VALUE, col = geo, shape = sex))+
  geom_point()+
  xlab("Year") +
  ylab("Life expectancy at 65 (years)")+
  scale_x_continuous(breaks = seq(2010, 2021, 2))+
  scale_y_continuous(limits = c(10,25))+
  theme_bw()+
  scale_color_manual(values = c("#999999", "#E69F00", "#56B4E9", "firebrick"))

Changer le titre des légende et la taille des points

ggplot(df1, aes(x=TIME_PERIOD, y=OBS_VALUE, col = geo, shape = sex))+
  geom_point(size = 3)+ # Augmenter la taille des points sur le graphique
  xlab("Year") +
  ylab("Life expectancy at 65 (years)")+
  scale_x_continuous(breaks = seq(2010, 2021, 2))+
  scale_y_continuous(limits = c(10,25))+
  theme_bw()+
  scale_color_manual(values = c("#999999", "#E69F00", "#56B4E9", "firebrick"))+
  labs(col = "Pays", shape = "Sexe")+
  guides(colour = guide_legend(override.aes = list(size=4)),  
         shape = guide_legend(override.aes = list(size=4))) # Augmenter la taille des points dans la légende

Changer l’ordre des variables dans la légende avec order

ggplot(df1, aes(x=TIME_PERIOD, y=OBS_VALUE, col = geo, shape = sex))+
  geom_point(size = 3)+ 
  xlab("Year") +
  ylab("Life expectancy at 65 (years)")+
  scale_x_continuous(breaks = seq(2010, 2021, 2))+
  scale_y_continuous(limits = c(10,25))+
  theme_bw()+
  scale_color_manual(values = c("#999999", "#E69F00", "#56B4E9", "firebrick"))+
  labs(col = "Pays", shape = "Sexe")+
  guides(colour = guide_legend(override.aes = list(size=4), order = 2),  
         shape = guide_legend(override.aes = list(size=4), order = 1))

Afficher la légende des deux variables côte à côte avec legend.box

ggplot(df1, aes(x=TIME_PERIOD, y=OBS_VALUE, col = geo, shape = sex))+
  geom_point(size = 3)+ 
  xlab("Year") +
  ylab("Life expectancy at 65 (years)")+
  scale_x_continuous(breaks = seq(2010, 2021, 2))+
  scale_y_continuous(limits = c(10,25))+
  theme_bw()+
  scale_color_manual(values = c("#999999", "#E69F00", "#56B4E9", "firebrick"))+
  labs(col = "Pays", shape = "Sexe")+
  guides(colour = guide_legend(override.aes = list(size=4), order = 2),  
         shape = guide_legend(override.aes = list(size=4), order = 1))+
  theme(legend.box = "horizontal")

8 Un graphique par modalité de variable avec facet_wrap()

On fait un graphique par sexe

ggplot(df1, aes(x=TIME_PERIOD, y=OBS_VALUE, col = geo))+
  geom_point()+
  xlab("Year") +
  ylab("Life expectancy at 65 (years)")+
  scale_x_continuous(breaks = seq(2010, 2021, 2))+
  scale_y_continuous(limits = c(10,25))+
  theme_bw()+
  scale_color_manual(values = c("#999999", "#E69F00", "#56B4E9", "firebrick"))+
  facet_wrap(~sex)

Changer le nom des modalité de la variable utilisée pour facet_wrap avec labeller

# On doit définir préalablement les nouveaux labels
sex.labs <- c("Females", "Males", "Total population")
names(sex.labs) <- c("F", "M", "T") # et leur attribuer en nom la modalité d'origine

ggplot(df1, aes(x=TIME_PERIOD, y=OBS_VALUE, col = geo))+
  geom_point()+
  xlab("Year") +
  ylab("Life expectancy at 65 (years)")+
  scale_x_continuous(breaks = seq(2010, 2021, 2))+
  scale_y_continuous(limits = c(10,25))+
  theme_bw()+
  scale_color_manual(values = c("#999999", "#E69F00", "#56B4E9", "firebrick"))+
  facet_wrap(~sex,
             labeller = labeller(sex = sex.labs))

Changer la couleur de l’arrière plan des labels

# Pour relabel 
sex.labs <- c("Females", "Males", "Total population")
names(sex.labs) <- c("F", "M", "T") 

ggplot(df1, aes(x=TIME_PERIOD, y=OBS_VALUE, col = geo))+
  geom_point()+
  xlab("Year") +
  ylab("Life expectancy at 65 (years)")+
  scale_x_continuous(breaks = seq(2010, 2021, 2))+
  scale_y_continuous(limits = c(10,25))+
  theme_bw()+
  scale_color_manual(values = c("#999999", "#E69F00", "#56B4E9", "firebrick"))+
  facet_wrap(~sex,
             labeller = labeller(sex = sex.labs))+
  theme(strip.background = element_rect(fill = "grey"))

On peut faire une forme par pays et une couleur par sexe

# Pour relabel 
sex.labs <- c("Females", "Males", "Total population")
names(sex.labs) <- c("F", "M", "T") 

ggplot(df1, aes(x=TIME_PERIOD, y=OBS_VALUE, shape = geo, col = sex))+
  geom_point()+
  xlab("Year") +
  ylab("Life expectancy at 65 (years)")+
  scale_x_continuous(breaks = seq(2010, 2021, 2))+
  scale_y_continuous(limits = c(10,25))+
  theme_bw()+
  scale_color_manual(values = c( "#E69F00", "#56B4E9", "firebrick"))+
  facet_wrap(~sex,
             labeller = labeller(sex = sex.labs))+
  theme(strip.background = element_rect(fill = "grey"))

Pour plus de détails sur la personnalisation des facets :
http://www.sthda.com/french/wiki/ggplot2-facet-diviser-un-graphique-en-plusieurs-panneaux-logiciel-r-et-visualisation-de-donnees
https://www.datanovia.com/en/blog/how-to-change-ggplot-facet-labels/

9 Ressources

D’une façon générale, les sites Datanovia et STHDA sont très bien faits et très complets pour tout ce qui concernent les graphiques en R